const Service = require("egg").Service;
const errorLog = require("../utils/errorLog");

class MenuService extends Service {
  async createMenu(menuObj) {
    try {
      menuObj.createAt = Date.now();
      menuObj.updateAt = Date.now();
      menuObj.isShow = 1;
      const menu = await this.app.model.MenuModel.create(menuObj);
      return menu;
    } catch (err) {
      errorLog("MenuSerive----->createMenu", err);
      return false;
    }
  }

  async getMenuList() {
    try {
      const menuList = await this.app.model.MenuModel.findAll({
        where: {
          isShow: 1,
        },
      });
      return menuList;
    } catch (err) {
      errorLog("MenuSerive----->getMenuList", err);
      return false;
    }
  }

  async updateMenu(menuObj) {
    try {
      const menu = await this.app.model.MenuModel.findOne({
        where: {
          id: menuObj.id,
        },
      });
      if (menu) {
        if (menuObj.menuParentId !== undefined && menu.menuParentId !== null)
          menu.menuParentId = menuObj.menuParentId;
        if (menuObj.menuName && menuObj.menuName !== "")
          menu.menuName = menuObj.menuName;
        if (menuObj.menuRouterName && menuObj.menuRouterName !== "")
          menu.menuRouterName = menuObj.menuRouterName;
        if (menuObj.menuPath) menu.menuPath = menuObj.menuPath;
        if (menuObj.menuComponent) menu.menuComponent = menuObj.menuComponent;
        if (menuObj.menuIcon) menu.menuIcon = menuObj.menuIcon;
        if (menuObj.menuType) menu.menuType = menuObj.menuType;
        menu.updateAt = Date.now();
        console.log(menuObj.menuParentId);
        console.log(menu.menuParentId);
        return await menu.save();
      }
    } catch (err) {
      errorLog("MenuSerive----->updateMenu", err);
      return false;
    }
  }

  async deleteMenu(id) {
    try {
      const menu = await this.app.model.MenuModel.findOne({
        where: {
          id,
        },
      });

      if (menu) {
        // 隐藏当前菜单
        menu.isShow = 0;
        menu.updateAt = Date.now();
        await menu.save();

        // 查找所有子菜单并隐藏它们
        const childMenus = await this.app.model.MenuModel.findAll({
          where: {
            menuParentId: id,
          },
        });

        // 批量更新子菜单的 isShow 和 updateAt 字段
        if (childMenus.length > 0) {
          await this.app.model.MenuModel.update(
            {
              isShow: 0,
              updateAt: Date.now(),
            },
            {
              where: {
                id: childMenus.map((child) => child.id),
              },
            }
          );
        }

        // 删除 RoleMenu 相关记录（父级菜单及其子菜单）
        await this.app.model.RoleMenu.destroy({
          where: {
            menuId: {
              [this.app.Sequelize.Op.in]: [
                id,
                ...childMenus.map((child) => child.id),
              ],
            },
          },
        });

        return menu;
      }
    } catch (err) {
      errorLog("MenuService----->deleteMenu", err);
      return false;
    }
  }

  async getMenuTreeByRoleId(roleId) {
    console.log(roleId);
    try {
      const role = await this.ctx.model.RoleModel.findByPk(roleId);
      if (!role) {
        return false;
      }

      const menus = await role.getMenu({
        attributes: [
          "id",
          "menuName",
          "menuParentId",
          "menuPath",
          "menuRouterName",
          "menuComponent",
          "menuIcon",
          "menuType",
          "isShow",
        ],
      });

      return menus;
    } catch (err) {
      errorLog("MenuService----->getMenuTreeByRoleId", err);
    }
  }
}

module.exports = MenuService;
